package jiang.jredis.lock.annotation;

import jiang.jredis.lock.RedisLockAspect;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 分布式锁注解
 * 默认使用Redis锁
 * @see RedisLockAspect
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {

    /**
     * 指定名称，同一名称、同一key的锁，同一时间只有一个线程能进入
     * 适合用在多个方法需要加一把锁的情况
     * 如果不指定name，默认name为方法坐标（类名.方法名），此时@Lock等于synchronized（分布式的），即同一时间只有一个线程能进入该方法
     * 生成redis key的格式为：lock:[name]:[key1],[key2]...
     */
    String name() default "";

    /**
     * 指定锁的key，使用spEL表达式
     * 如果不指定key，默认key为全部参数：p1,p2,...
     * 示例：
     * 1.使用方法入参作为key： key="#productId"<br>
     * 2.方法入参是对象时，以对象中的属性作为key： key="#product.id"<br>
     * 3.多个入参联合作为key： key="#productId,#userId"<br>
     */
    String key() default "";

    /**
     * 最大等待时长，超过后还未加锁成功则抛出异常
     * 默认单位：秒，设置0表示不等待
     */
    int waitTime() default 2;

    /**
     * 加锁后自动释放时间
     * 默认自动续期（-1）
     */
    int leaseTime() default -1;

    /**
     * 时间单位
     */
    TimeUnit unit() default TimeUnit.SECONDS;

}
